node.js 异步编程


1、函数式编程


  • 高阶函数
  • 偏函数

    2、难点


  • 异常处理
  • 函数嵌套过深
  • 阻塞代码
  • 多线程编程f

    3、异步编程解决方案

    3.1、事件发布/订阅模式

事件发布常常用来解耦业务逻辑,发布者无需关注订阅的侦听器如何实现业务逻辑。

操作简单,示例代码

1
2
3
4
5
6
7
//订阅0
emitter.on("event1",function(message){
console.log(message);
});
//发布
emitter.emit("event1","O am message!");
//emit()调用多半是伴随时间循环而异步触发的,故而说事件发布/订阅广泛应用于事件编程。

Node对事件发布/订阅做了额外的处理

  1. 对一个事件添加超多10个侦听器会得到一条警告。
  2. 为了处理异常,EventEmitter对error事件进行了特殊处理。
  • 继承自events模块
  • 利用事件队列解决雪崩问题
  • 多异步之间的协作方案
  • EventProxy的原理
  • EvenrttProxy的异常处理

继承自events模块

Node在util模块中封装了集成的方法

1
2
3
4
5
var events =require('evbents'),
function Stream(){
events.EventEmitter.call(this);
}
util.inherits(Stream,events.EventEmitter);

利用事件队列解决雪崩问题

雪崩问题:在高访问量、大并发量的情况下缓存失效的情景。
EventProxy来自于Backbone的事件模块,它是对事件订阅/发布模式的扩充。
Backbone.js为复杂WEB应用程序提供模型(models)、集合(collections)、视图(views)的结构。其中模型用于绑定键值数据和自定义事件;集合附有可枚举函数的丰富API; 视图可以声明事件处理函数,并通过RESRful JSON接口连接到应用程序。
此项目托管在 GitHub 上, 并且提供 带注释的源码, 在线的 测试套件, 应用示例, 教程列表 还有一个 实际应用项目的超长列表, 这些项目都使用了 Backbone. Backbone 允许在 MIT 软件协议 下使用.
EventProxy的异常处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
//主要抽象出了done()和fail()函数,简化流程操作和代码量。
var ep=new EventProxy();
ep.all('tpl','data',function(tpl,data){
//成功回调
callback(null,{
template:tpl,
data:data
});
});
//绑定错误处理函数
ep.fail(callback);
fs.readFile('template.tpl','utf-8',ep.done('tpl'));
db.get('some sql',ep.done('data'));

3.2、Promise/Deferred模式

3.3、流程控制库